//输入n行m列的图，X代表障碍物，S为起始点，D为终点，.代表可以走的格子，问是否能在k秒正好到达迷宫终点
//规定每个.格子只能走一次
//两种剪枝方法：路径长度剪枝和奇偶剪枝
//奇偶剪枝指构造一个图，行加列为奇数则1，否则为0，那么从1走到0（或者从0走到1）需要奇数次，从1走到1（或从0走到0）需要偶数次
#include <iostream>
#include <cmath>
using namespace std;
char maze[9][9];
int starti,startj,endi,endj,t,n,m;
int escape; //标记逃离成功
int direction[4][2]={{0,1},{0,-1},{-1,0},{1,0}};        //常用的方向数组，用来模拟上下左右移动

void dfs(int pi,int pj,int time){

    if(pi==endi&&pj==endj&&time==t){
        escape=1;
        return ;
    }

    if(pi<1||pj<1||pi>n||pj>m) return;
    if(time>t) return;//剪枝1
    for(int i=0;i<4;i++){       //i是枚举四个方向
        if(maze[pi+direction[i][0]][pj+direction[i][1]]!='X'){  //剪枝，下一个是障碍物就没必要再继续了
            maze[pi][pj]='X';
            dfs(pi+direction[i][0],pj+direction[i][1],time+1);
            maze[pi][pj]='.';   //回溯
            if(escape) return ;
        }
    }
    return ;
}
int main(){
    while(cin>>n>>m>>t){
        int wall=0;
        escape=0;
        if(n==0&&m==0&&t==0) return 0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>maze[i][j];
                if(maze[i][j]=='S') {starti=i;startj=j;continue;}
                else if(maze[i][j]=='D') {endi=i;endj=j;continue;}
                else if(maze[i][j]=='X') wall++;
            }
        }
        if(n*m-wall<t) {
            cout<<"NO"<<endl;
            continue;
        }

                        //奇偶剪枝          奇偶性相同才有可能逃离
        if((t+abs(starti-endi)+abs(startj-endj))%2==1){
            cout<<"NO"<<endl;
            continue;
        }

        
        dfs(starti,startj,0);
        if(escape) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
/*

4 4 5
S.X.
..X.
..XD
....

NO

3 4 5
S.X.
..X.
...D

YES
*/